The following sections showing the main techniques which we discoverd to improve the speed of our application.

\section{Forward and reverse solving}
Sometimes it is faster to find a solution to move the boxes from the initial position to the goals and sometimes its faster to move the boxes from the goal to the initial positions of the boxes. That's why the application is trying both directions parallel.
That means that two diffrent solver running in a seperate threads. One in forward and one in reversed direction.

\section{Ranking calculation}
With the help of the in ranking arry, which is descripted in chapter \ref{ch:cost}, it is not necessary to compute the score of a state each node in a complicated way.
It is enough to create the ranking array once at the startup of the application.
The score of a state is determinated by the sum of all values in the ranking arry at the coordinates of all boxes.

\section{Storing the states}

It is necessary to find a gently memory usage way to store the state of the game. That’s the reason why only the position of the player and the boxes are stored to represent a state. Test runs showed quickly that the performance is improving a lot if the states are stored in way where it is fast to check if they are containing in the list. It figured out that the best way to do this is to store the states in a ordered linked list. That’s the reason to use an object of the class “java.util.LinkedList<PlayerNBoxes>”.  That makes it possible to search the states with the help of a binary search algorithm.  Therefor, it is necessary to add a new state at the right position in the list. The using of the java.util.LinkedList provides these requirements very efficient.

Earlier versions showed that this is the fastest way to store them. Other ideas like e.g. a hashmap had a slower look up time.  
 
\section{States comparing}
To decide which states are already visited it is necessary to compare the states. 
First of all the boxes must be at the positions. If this is not a case the two states are not the same. 
In the second step it depends on the position of the player. The player can have diffrent coordinates but the state is same. It is only necessary to check area which the player could reach without moving a box.  